/*
    KMC Simulation
    Copyright (c) 2012 Filip Rozbořil

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "includes.h"

class Random
{
 	public:
 		virtual uint32_t getInteger() = 0;
 		double getDouble() { return ((double)getInteger() + .5) * (1. / 4294967296.); }
 		uint32_t getInteger(int32_t max) { return (uint32_t)(getDouble() * max); }
 		bool getBoolean(); 
 		Random() : _bitCount(32) { }
 		virtual ~Random() { }
 	private:                   
 		int32_t _bitCount;
 		uint32_t _bitBuffer;
};

inline bool Random :: getBoolean()
{
	if (_bitCount == 32) 
	{ 
		_bitBuffer = getInteger();
		_bitCount = 1;
      return (_bitBuffer & 0x1) == 1;
   }
   _bitCount++;
   return ((_bitBuffer >>= 1) & 0x1) == 1;
}



